#include "../head.h"

// 互斥锁 对一个资源进行上锁和解锁操作，从而实现资源的互斥访问  作用于线程

pthread_mutex_t mutex;
int g_val = 0;
void *thread_func1(void *arg)
{
    printf("thread1\n");
    // 上锁
    pthread_mutex_lock(&mutex);
    g_val = 100;
    sleep(3);
    printf("thread1 g_val = %d\n", g_val);
    // 解锁
    pthread_mutex_unlock(&mutex);
}

void *thread_func2(void *arg)
{
    printf("thread2\n");
    sleep(1);
    // 上锁
    pthread_mutex_lock(&mutex);
    g_val = 200;
    printf("thread2 g_val = %d\n", g_val);
    // 解锁
    pthread_mutex_unlock(&mutex);
}

int main()
{
    printf("main\n");
    // 初始化
    pthread_mutex_init(&mutex, NULL); // 互斥锁地址 属性
    // 上述两句等价于pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;

    pthread_t thread1;
    pthread_create(&thread1, NULL, thread_func1, NULL);
    pthread_t thread2;
    pthread_create(&thread2, NULL, thread_func2, NULL);

    // 上锁 pthread_mutex_lock(&mutex); 尝试上锁 pthread_mutex_trylock(&mutex);
    // 上锁失败会阻塞等待 尝试上锁失败会返回错误码 不阻塞
    // 解锁 pthread_mutex_unlock(&mutex);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    printf("main end\n");

    return 0;
}